package com.kehong.flybird.code;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author zhang peng yang ming
 * @CopyRight (C) http://www.csdn.com
 * @brief 鸟
 * @email 122162005@qq.com
 * @date 2018-07-06
 */
public class Bird {
    private int x;
    private int y;
    private BufferedImage currentImage;  // 贴图
    private BufferedImage[] images;
    // 我们把小鸟看成一个正方形，只取贴图有效部分（非透明）的宽度和高度
    private static final int SIZE = 20;
    // 小鸟当前图片的下标
    private int index;

    // 游戏开始，每次点击时，小鸟上扬的初速度
    private final double v = 20.0;
    // 每次计算小鸟位移的时间
    private final double t = 0.25;
    // 重力加速度
    private final double g = 4;
    // vt
    private double vt;

    private double angle;
    private final double horizon_s = 8.5;

    public Bird() throws IOException {
        // 一次性加载所有的小鸟图片
        images = new BufferedImage[] {
                ImageIO.read(getClass().getResource("resources/0.png")),
                ImageIO.read(getClass().getResource("resources/1.png")),
                ImageIO.read(getClass().getResource("resources/2.png"))
        };

        currentImage = images[0];

        x = 100;
        y = 280;
    }


    /**
     * 小鸟飞行
     * (1) 上抛速度计算 V=Vo-gt
     * (2) 上抛距离计算 S=Vot-1/2gt^2
     */
    public void step() {
        double v0 = vt;  // 当前初速度
        double s = v0 * t - 0.5 * g * t * t;

        y = y - (int) s;
        angle = Math.atan(s / horizon_s);  // 小鸟图片的偏转角度
        vt = v0 - g * t; // 改变 当前速度（其实是下一次 v0）
        // 价低小鸟翅膀扇动频率的次数倍数
        int freq = 7;
        index++;
        if (index % (images.length * freq) == 0) {
            index = 0;
        }

        currentImage = images[(index / freq) % images.length];
    }

    public void flappy() {
        vt = v;
    }
    /**
     * 以小小鸟的中心绘制图片
     * @param g
     */
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g.drawRect(x, y, SIZE, SIZE);
        g2d.rotate(-angle, x, y);
        g.drawImage(currentImage, x - (SIZE / 2), y - (SIZE / 2), null);
        g2d.rotate(angle, this.x, this.y);
    }

    /**
     * 与地面或者柱头是否碰撞
     * @param ground
     * @param column1
     * @param column2
     * @return
     */
    public boolean hit(Ground ground, Column column1, Column column2) {
        return hitGround(ground) || hitColumn(column1) || hitColumn(column2);
    }

    /** 判断鸟是否通过柱子 */
    public boolean pass(Column col1, Column col2) {
        return col1.getX()==x || col2.getX()==x;
    }
    /**
     * 判断小鸟是否与地板相接触
     * @return
     */
    public boolean hitGround(Ground ground) {
        return (y + SIZE / 2) >= ground.getY() || (y - SIZE / 2) < 0;
    }

    /**
     * 判断小鸟是否与管道相接触 3230
     * @return
     */
    public boolean hitColumn(Column column) {
        // 判断 鸟 是否在柱子体内
        if (column.getX() - column.getWidth() / 2 < x + (SIZE / 2)
                && x - (SIZE / 2) < column.getX() + column.getWidth() / 2 ) {

            // 判断是否与柱子相撞
            if (y - (SIZE / 2) < column.getY() - (column.getGap() / 2)
                    || y + (SIZE / 2) > column.getY() + (column.getGap() / 2)) {
                return true; // 与柱子相撞返回true
            }
        }
        return false;
    }
}
